#include <Master.hpp>
#include <Sieve.hpp>
#include <mpi.h>
#include <fstream>

int main (int argc, char* argv[]) {

	// Inicia ambiente MPI
	MPI::Init(argc, argv);

	// Configure tempo para efetuar trocas de dados
	int exchangeTime;
	sscanf(argv[2], "%d", &exchangeTime);


	// Captura ID do processo e quantidade de processos
	int pid 	  = MPI::COMM_WORLD.Get_rank();
	int processes = MPI::COMM_WORLD.Get_size();

	// Cria um runnable
	Runnable * runnable;

	std::fstream file;

	// Se for mestre, o runnable sera do tipo Master
	if (!pid) {
		file.open(argv[1], std::fstream::in);
		runnable = new Master(file, processes, exchangeTime);

	// Caso contrario, sera Slave(digitado errado) - escravo
	} else {
		runnable = new Sieve(pid, processes, exchangeTime);
	}

	// Roda o runnable
	runnable->run();

	// Apenas o mestre deve fechar o arquivo
	if (!pid) 
		file.close();

	delete runnable;

	// Finaliza ambiente paralelo
	MPI::Finalize();

	return 0;
}
